//配置路由的地方
import store from '@/store';
import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './routes'
//使用插件
Vue.use(VueRouter);


//把VueRouter原型对象的push以及replace备份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

//重写push | replace
//第一个参数 ： 告诉原来的push方法往哪里跳转（传播哪些参数）
//第二个参数：成功回调
//第三个参数：失败回调

//call | apply区别
//相同点：都可以调用函数一次，都可以篡改函数上下文一次
//不同点：call和apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
//重写push
VueRouter.prototype.push = function(location,resolve,reject){
    if(resolve && reject){
        originPush.call(this,location,resolve,reject); 
    }else {
        originPush.call(this,location,()=>{},()=>{})
    }
}
//重写replace
VueRouter.prototype.place = function(location,resolve,reject){
    if(resolve && reject){
        originReplace.call(this,location,resolve,reject); 
    }else {
        originReplace.call(this,location,()=>{},()=>{})
    }
}

//配置路由
let router =  new VueRouter({
    routes,
    //scrollBehavior方法，在跳转新的路由时，可以设置页面显示位置
    scrollBehavior(to,from,savedPosition){
        //返回值的y=0，代表滚动到顶部
        return {y:0}
    }
});

//全局守卫：前置守卫(路由跳转之间进行判断)
router.beforeEach(async (to,from,next)=>{
    //to:获得要跳转到那个路由的信息
    //from：可以获得从哪个路由而来的信息
    //next：放行函数。
    //直接next()  相当于直接放行 ，next(path)放行到指定路由
    //next(false) :中断当前的路由
    next();
    //用户登录之后会有token
    let token = store.state.user.token;
    let name = store.state.user.userInfo.name;
    if(token){
        //用户登录之后，去了login组件，则路由守卫阻止
        if(to.path=='/login' || to.path=='/register'){
            next('/home')
        }else{
            //登录之后，没有去login组件
            if(name){
                next();
            }else{
                //没有用户信息，派发action让仓库存储用户信息再跳转
                try {
                    //获取用户信息在首页展示
                    await store.dispatch('getUserInfo');
                    //放行
                    next();
                } catch (error) {
                    //token失效了，获取不到用户信息，重新登陆
                    //清除token
                    await store.dispatch('userLogout');
                    next('/login')
                }
            }
        }
    }else{
        //未登录，不能去交易相关页面、支付相关页面【pay\paysuccess】、不能去个人中心
        //未登录时点击上述页面，需要跳转到登陆页面
        let toPath =to.path;
        if(toPath.indexOf('/trade')!= -1 ||toPath.indexOf('/pay')!= -1 ||toPath.indexOf('/center')!= -1){
            //把未登陆的时候想去而没有去成的信息存储在地址栏中[路由]
            next('/login?redirect='+toPath)
        }else{
            //去的不是上面这些路由---放行
            next();
        }
        
    }
})

export default router